/**
 * 前端音频处理工具类
 */

/**
 * 获取音频文件时长
 * @param {File|Blob} file 音频文件对象
 * @param {String} filePath 音频文件路径（uni-app用）
 * @returns {Promise<number>} 音频时长（秒）
 */
export const getAudioDuration = (file, filePath = null) => {
	return new Promise((resolve, reject) => {
		try {
			// #ifdef H5
			// 在H5环境中使用HTML5 Audio API
			if (file instanceof File || file instanceof Blob) {
				const audio = new Audio();
				const url = URL.createObjectURL(file);
				
				audio.addEventListener('loadedmetadata', () => {
					const duration = Math.floor(audio.duration || 0);
					URL.revokeObjectURL(url); // 清理内存
					resolve(duration);
				});
				
				audio.addEventListener('error', (e) => {
					URL.revokeObjectURL(url);
					console.warn('获取音频时长失败:', e);
					resolve(0); // 失败时返回0，不影响上传
				});
				
				audio.src = url;
			} else {
				resolve(0);
			}
			// #endif
			
			// #ifdef MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ
			// 小程序环境中使用createInnerAudioContext
			if (filePath) {
				const audioContext = uni.createInnerAudioContext();
				
				audioContext.onCanplay(() => {
					const duration = Math.floor(audioContext.duration || 0);
					audioContext.destroy();
					resolve(duration);
				});
				
				audioContext.onError((e) => {
					console.warn('获取音频时长失败:', e);
					audioContext.destroy();
					resolve(0); // 失败时返回0，不影响上传
				});
				
				audioContext.src = filePath;
			} else {
				resolve(0);
			}
			// #endif
			
			// #ifdef APP-PLUS
			// App环境中的处理
			if (filePath) {
				// 尝试使用HTML5 Audio API
				const audio = new Audio();
				
				audio.addEventListener('loadedmetadata', () => {
					const duration = Math.floor(audio.duration || 0);
					resolve(duration);
				});
				
				audio.addEventListener('error', (e) => {
					console.warn('获取音频时长失败:', e);
					resolve(0); // 失败时返回0，不影响上传
				});
				
				audio.src = filePath;
			} else {
				resolve(0);
			}
			// #endif
			
		} catch (error) {
			console.warn('获取音频时长异常:', error);
			resolve(0); // 异常时返回0，不影响上传
		}
	});
};

/**
 * 获取音频文件信息
 * @param {Object} file 文件对象
 * @param {String} filePath 文件路径
 * @returns {Promise<Object>} 音频文件信息
 */
export const getAudioInfo = async (file, filePath = null) => {
	try {
		const duration = await getAudioDuration(file, filePath);
		
		return {
			name: file.name || '未知文件',
			size: file.size || 0,
			type: file.type || 'audio/mpeg',
			duration: duration,
			path: filePath
		};
	} catch (error) {
		console.warn('获取音频信息失败:', error);
		return {
			name: file.name || '未知文件',
			size: file.size || 0,
			type: file.type || 'audio/mpeg',
			duration: 0,
			path: filePath
		};
	}
};

/**
 * 格式化音频时长为 mm:ss 格式
 * @param {number} seconds 秒数
 * @returns {string} 格式化的时长
 */
export const formatDuration = (seconds) => {
	if (!seconds || seconds <= 0) {
		return '0:00';
	}
	
	const minutes = Math.floor(seconds / 60);
	const remainingSeconds = seconds % 60;
	
	return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`;
};

/**
 * 批量获取音频文件信息
 * @param {Array} files 文件数组
 * @param {Array} filePaths 文件路径数组
 * @returns {Promise<Array>} 音频信息数组
 */
export const getBatchAudioInfo = async (files, filePaths = []) => {
	const promises = files.map((file, index) => {
		const filePath = filePaths[index] || null;
		return getAudioInfo(file, filePath);
	});
	
	try {
		const results = await Promise.all(promises);
		return results;
	} catch (error) {
		console.warn('批量获取音频信息失败:', error);
		// 返回基础信息，不包含时长
		return files.map((file, index) => ({
			name: file.name || `音频文件_${index + 1}`,
			size: file.size || 0,
			type: file.type || 'audio/mpeg',
			duration: 0,
			path: filePaths[index] || null
		}));
	}
};

/**
 * 验证音频文件格式
 * @param {string} fileName 文件名
 * @param {Array} allowedFormats 允许的格式
 * @returns {boolean} 是否为有效格式
 */
export const validateAudioFormat = (fileName, allowedFormats = ['mp3', 'wav', 'm4a', 'aac']) => {
	if (!fileName) return false;
	
	const ext = fileName.toLowerCase().split('.').pop();
	return allowedFormats.includes(ext);
};

/**
 * 获取音频文件格式
 * @param {string} fileName 文件名
 * @returns {string} 文件格式
 */
export const getAudioFormat = (fileName) => {
	if (!fileName) return 'unknown';
	return fileName.toLowerCase().split('.').pop() || 'unknown';
};
